<?php

class CriptSupport {

    static function criptFull($string) {
        if (is_string($string) || is_numeric($string)) {
            return sha1(md5($string) . sha1($salt)); //retorna 40 caracteres
        }
    }

    static function criptPass(Usuario $usuario) {
        return (string) CriptSupport::criptFull($usuario->senha.$usuario->salt);
    }

    static function get_rnd_iv($iv_len) {
        $iv = '';
        while ($iv_len-- > 0) {
            $iv .= chr(mt_rand() & 0xff);
        }
        return $iv;
    }

    static function encrypt($plain_text, $password, $iv_len=16) {
        /*
         * implementação minha com sha1 no password
         */
        $password = sha1($password);
        $plain_text .= "\x13";

        $n = strlen($plain_text);
        if ($n % 16)
            $plain_text .= str_repeat("\0", 16 - ($n % 16));
        $i = 0;
        $enc_text = self::get_rnd_iv($iv_len);
        $iv = substr($password ^ $enc_text, 0, 512);
        while ($i < $n) {
            $block = substr($plain_text, $i, 16) ^ pack("H*", md5($iv));
            $enc_text .= $block;
            $iv = substr($block . $iv, 0, 512) ^ $password;
            $i += 16;
        }
        return base64_encode($enc_text);
    }

    static function decrypt($enc_text, $salt, $iv_len = 16) {
        /*
         * implementação minha com sha1 no password
         */
        $password = sha1($salt);

        $enc_text = base64_decode($enc_text);
        $n = strlen($enc_text);

        $i = $iv_len;
        $plain_text = '';
        $iv = substr($password ^ substr($enc_text, 0, $iv_len), 0, 512);


        while ($i < $n) {
            $block = substr($enc_text, $i, 16);
            $plain_text .= $block ^ pack("H*", md5($iv));
            $iv = substr($block . $iv, 0, 512) ^ $password;
            $i +=16;
        }
        //return $plain_text.'.';
        //return preg_replace('/\x13\x00*$/', '', $plain_text);
        return preg_replace('/\x13\x00*$/', '', $plain_text);
    }

}

?>
